package com.ts.api.http.platform.biz;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gitee.apanlh.util.algorithm.encrypt.symmetric.AES;
import com.gitee.apanlh.util.base.*;
import com.gitee.apanlh.util.cache.redis.RedisKeyBuilder;
import com.gitee.apanlh.util.cache.redis.api.RedisString;
import com.gitee.apanlh.util.dataformat.JsonUtils;
import com.gitee.apanlh.util.valid.ValidParam;
import com.gitee.apanlh.web.model.vo.RequestVO;
import com.ts.api.common.util.H5DomainUrlUtils;
import com.ts.api.http.platform.entity.apply.ApiPlatApplyKaiXinHua;
import com.ts.api.http.platform.entity.dataexchange.ApiPlatDataExchangeKaiXinHua;
import com.ts.api.module.api.convert.core.annotation.ApiPlan;
import com.ts.api.module.api.convert.core.annotation.ApiPlanConvertType;
import com.ts.api.module.api.convert.core.entity.ApiApplyParameter;
import com.ts.api.module.api.convert.core.entity.ApiBizStatus;
import com.ts.api.module.api.convert.core.entity.ApiDataExchangeParameter;
import com.ts.api.module.api.convert.platform.entity.RespPlatformMultiPhoneMaskDataExchange;
import com.ts.api.module.api.convert.platform.entity.RespPlatformNoticeApply;
import com.ts.api.module.api.convert.platform.entity.RespPlatformPhoneMaskApply;
import com.ts.api.module.api.convert.platform.entity.RespPlatformPhoneMaskDataExchange;
import com.ts.api.module.api.convert.platform.handler.ApiPlatformPhoneMaskConvertHandler;
import com.ts.api.module.api.entity.ApiProtocol;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 安心分期（出）&开心花 全28 8位+MD5
 * <a href="https://docs.apipost.net/docs/4bda50d518e1000?locale=zh-cn">...</a>
 *
 * @author 李源聪
 */
@ApiPlan(productId = "385", type = ApiPlanConvertType.PLAT_PHONE_MASK)
public class ApiPlatKaiXinHuaPhoneMaskConvert implements ApiPlatformPhoneMaskConvertHandler {
    private static final String KEY = "uAKhToXCaUL55kZW";
    private static final String CHANNEL_CODE = "9zF9pUqwde";

    private static final RedisString TEMP = RedisKeyBuilder.builder().withKeys("temp_kai_xin_hua_8").buildString();

    @Override
    public Object dataExchange(ApiDataExchangeParameter apiDataExchangeParameter) {
        ApiPlatDataExchangeKaiXinHua apiPlatDataExchangeKaiXinHua = new ApiPlatDataExchangeKaiXinHua();
        dataExchangeFieldMapping(apiDataExchangeParameter, apiPlatDataExchangeKaiXinHua);
        String json = JsonUtils.toJson(apiPlatDataExchangeKaiXinHua);
        AES ecb = AES.createEcb(KEY.getBytes());
        String data = ecb.encryptToBase64Str(json);
        Map<String, Object> ObjectMap = MapUtils.newHashMap(newMap -> {
            newMap.put("data", data);
            newMap.put("channel_code", CHANNEL_CODE);
        });
        return JsonUtils.toJson(ObjectMap);
    }

    @Override
    public RespPlatformMultiPhoneMaskDataExchange respDataExchange(String respJson) {
        //  撞库返回响应体判断
        JSONObject jsonObject = JsonUtils.get(respJson);
        if (jsonObject == null) {
            return RespPlatformMultiPhoneMaskDataExchange.ofFail();
        }
        if (!Eq.object(jsonObject.getString("code"), "200")) {
            return RespPlatformMultiPhoneMaskDataExchange.ofFail();
        }

        JSONArray resDataArray = jsonObject.getJSONArray("result");
        if (resDataArray.isEmpty()) {
            return RespPlatformMultiPhoneMaskDataExchange.ofFail();
        }

        RespPlatformMultiPhoneMaskDataExchange respPlatformMultiPhoneMaskDataExchange = RespPlatformMultiPhoneMaskDataExchange.ofSuc();
        List<RespPlatformPhoneMaskDataExchange> listRespPlatformPhoneMaskDataExchange = CollUtils.newArrayList();
        for (int i = 0; i < resDataArray.size(); i++) {
            JSONObject resData = resDataArray.getJSONObject(i);
            if (ValidParam.isNotNull(resData)) {
                BigDecimal price = resData.getBigDecimal("price");
                String companyName = resData.getString("agency_name");
                String productName = resData.getString("product_name");
                String logo = resData.getString("agency_logo");
                String orderId = resData.getString("product_no");
                String reqId = resData.getString("request_id");
                HashMap<String, String> hashMap = new HashMap<>();
                hashMap.put("reqId", reqId);
                hashMap.put("orderId", orderId);
                String json = JsonUtils.toJson(hashMap);
                TEMP.setForMinutes(orderId,json, 3);

                List<ApiProtocol> protocolList = CollUtils.newArrayList(newList -> {
                    //  获取协议
                    JSONArray listProtocolResult = resData.getJSONArray("agreement");
                    IteratorUtils.array(listProtocolResult, (item, index) -> {
                        JSONObject protocolObject = listProtocolResult.getJSONObject(index);
                        ApiProtocol protocol = new ApiProtocol();
                        protocol.setProtocolName(protocolObject.getString("name"));
                        protocol.setProtocolUrl(protocolObject.getString("url"));
                        newList.add(protocol);
                    });
                });

                List<String> phoneMd5List = CollUtils.newArrayList(newList -> {
                    JSONArray jsonArray = resData.getJSONArray("phone_md5_lists");
                    IteratorUtils.array(jsonArray, (item, index) -> {
                        String phoneMd5 = jsonArray.getString(index);
                        newList.add(phoneMd5);
                    });
                });
                RespPlatformPhoneMaskDataExchange result = RespPlatformPhoneMaskDataExchange.of();

                result.setPrice(price);
                result.setLogoPath(logo);
                result.setDisplayName(companyName);
                result.setProductName(productName);
                result.setApplyId(orderId);
                result.setProtocolList(protocolList);
                result.setListPhoneMd5(phoneMd5List);
                listRespPlatformPhoneMaskDataExchange.add(result);
            }
        }

        respPlatformMultiPhoneMaskDataExchange.setListPhoneMask(listRespPlatformPhoneMaskDataExchange);
        return respPlatformMultiPhoneMaskDataExchange;
    }

    @Override
    public Object apply(ApiApplyParameter apiApplyParameter) {
        ApiPlatApplyKaiXinHua apiPlatApplyKaiXinHua = new ApiPlatApplyKaiXinHua();
        applyFieldMapping(apiApplyParameter, apiPlatApplyKaiXinHua);
        String json = JsonUtils.toJson(apiPlatApplyKaiXinHua);
        AES ecb = AES.createEcb(KEY.getBytes());
        String data = ecb.encryptToBase64Str(json);
        Map<String, Object> ObjectMap = MapUtils.newHashMap(newMap -> {
            newMap.put("data", data);
            newMap.put("channel_code", CHANNEL_CODE);
        });
        return JsonUtils.toJson(ObjectMap);
    }

    @Override
    public RespPlatformPhoneMaskApply respApply(String respJson) throws Exception {
        JSONObject jsonObject = JsonUtils.get(respJson);
        if (jsonObject == null) {
            return RespPlatformPhoneMaskApply.ofFail();
        }
        if (!Eq.object(jsonObject.getInteger("code"), 200)) {
            return RespPlatformPhoneMaskApply.ofFail();
        }
        return RespPlatformPhoneMaskApply.ofSuc();
    }

    @Override
    public RespPlatformNoticeApply parseApplyNotice(RequestVO requestVO) {
        return null;
    }

    @Override
    public Map<String, Object> respApplyNotice(ApiBizStatus apiBizStatus) {
        return Map.of();
    }

    /**
     * 撞库字段转换映射
     * 1.撞库字段转换(不需要的自行删除)
     * 2.第一个形参值是我方值, 第二个形参值,是对方文档值,必须注意参数类型对应, end指的是如果都不存在给默认值)
     */
    private void applyFieldMapping(ApiApplyParameter apiDataChangeMessage, ApiPlatApplyKaiXinHua apiPlatDataExchange) {

        apiPlatDataExchange.setUserName(apiDataChangeMessage.getUserName());
        apiPlatDataExchange.setPhone(apiDataChangeMessage.getPhone());
        apiPlatDataExchange.setCity(apiDataChangeMessage.getCity());
        apiPlatDataExchange.setAge(apiDataChangeMessage.getAge());
        apiPlatDataExchange.setWeilidai("1");
        apiPlatDataExchange.setProvince(apiDataChangeMessage.getProvinceName());
        String loanTerm = ChooseEq.create(apiDataChangeMessage.getLoanTerm())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "4")
                .when("5", "4")
                .when("6", "4")
                .end("1");
        apiPlatDataExchange.setLoan_time(loanTerm);
        //  性别-要获取中文性别（男/女）使用apiFieldConverter.getSexText
        String sex = ChooseEq.create(apiDataChangeMessage.getSex())
                .when("0", "1")
                .when("1", "2")
                .end("1");
        apiPlatDataExchange.setSex(sex);

        /*
           我方字典-职业
           1.上班族
           2.自由职业
           3.企业主（有营业执照）
           4.公务员或事业单位
           如果对方需要"文字形式"如:上班族/公务员或事业单位,使用apiFieldConverter.getCareerText
           如果对方需要"有无职业或者是否有工作"如:有/无，使用使用apiFieldConverter.hasCareerToStr
           如果对方需要"有无职业或者是否有工作"如:0/1，使用使用apiFieldConverter.hasCareerToNumber
         */
        String career = ChooseEq.create(apiDataChangeMessage.getCareer())
                .when("1", "1")
                .when("2", "4")
                .when("3", "2")
                .when("4", "5")
                .when("5", "3")
                .end("1");
        apiPlatDataExchange.setCareer(career);

        /*
          我方字典-学历
          1.初中及以下
          2.中专
          3.高中
          4.大专
          5.本科
          6.研究生及以上
        */
        String educationAttainment = ChooseEq.create(apiDataChangeMessage.getEducationAttainment())
                .when("1", "2")
                .when("2", "4")
                .when("3", "3")
                .when("4", "5")
                .when("5", "6")
                .when("6", "7")
                .end("1");
        apiPlatDataExchange.setEducationAttainment(educationAttainment);

        /*
          我方字典-社保缴纳
          1.无社保
          2.缴纳6个月以下
          3.缴纳6个月以上
          4.有社保
          如果对方需要"有无社保情况"如:有/无，使用使用apiFieldConverter.hasSocialSecurityToStr
          如果对方需要"有无社保情况"如:0/1，使用使用apiFieldConverter.hasSocialSecurityToNumber
        */
        String socialSecurity = ChooseEq.create(apiDataChangeMessage.getSocialSecurity())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "2")
                .end("1");
        apiPlatDataExchange.setSocialSecurity(socialSecurity);

        /*
          我方字典-公积金
          1.无公积金
          2.缴纳6个月以下
          3.缴纳6个月以上
          4.有公积金
          如果对方只需要"有/无"使用:apiFieldConverter.hasProvidentFundToStr
          如果对方只需要"0/1"使用:apiFieldConverter.hasProvidentFundToNumber
        */
        String providentFund = ChooseEq.create(apiDataChangeMessage.getProvidentFund())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "2")
                .end("1");
        apiPlatDataExchange.setProvidentFund(providentFund);

        /*
          我方字典-房产情况
          1.无房产
          2.有房不抵押
          3.有房可抵押
          4.有房产
          5.有按揭房产
          6.有全款房产
          如果对方需要"有无月收入"如:有/无，使用使用apiFieldConverter.hasRealEstateInfoToStr
          如果对方需要"有无月收入"如:0/1，使用使用apiFieldConverter.hasRealEstateInfoToNumber
        */
        String realEstateInfo = ChooseEq.create(apiDataChangeMessage.getRealEstateInfo())
                .when("1", "1")
                .when("2", "3")
                .when("3", "4")
                .when("4", "3")
                .when("5", "2")
                .when("6", "3")
                .end("1");
        apiPlatDataExchange.setRealEstateInfo(realEstateInfo);

        /*
           我方字典-车辆情况
           1.无车产
           2.有车不抵押
           3.有车可抵押
           4.有车
           如果对方文档是需要返回"0"和"1" 使用:apiFieldConverter.hasCarInfoToNumber
           如果对方文档是需要返回"有"和"无",使用:apiFieldConverter.hasCarInfoToStr
         */
        String carInfo = ChooseEq.create(apiDataChangeMessage.getCarInfo())
                .when("1", "1")
                .when("2", "3")
                .when("3", "4")
                .when("4", "4")
                .end("1");
        apiPlatDataExchange.setCarInfo(carInfo);

       /*
            我方字典-保险保单
            1.无保险保单
            2.缴纳未满1年
            3.缴纳1年以上
            4.有保险保单
            如果对方只需要"有/无"使用:apiFieldConverter.hasInsurancePolicyToStr
            如果对方只需要"0/1"使用:apiFieldConverter.hasInsurancePolicyToNumber
        */
        String insurancePolicy = ChooseEq.create(apiDataChangeMessage.getInsurancePolicy())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "2")
                .end("1");
        apiPlatDataExchange.setInsurancePolicy(insurancePolicy);

        /*
           我方字典-芝麻分
           1.600分以下
           2.600~649分
           3.650~699分
           4.700分以上
           如果对方需要"分值形式"如:650，700,使用apiFieldConverter.getSesameCreditNumber/getSesameCreditStr
           如果对方要"文字形式"如:600分以下,600~649分,使用apiFieldConverter.getSesameCreditText
         */
        String sesameCredit = ChooseEq.create(apiDataChangeMessage.getSesameCredit())
                .when("1", "2")
                .when("2", "3")
                .when("3", "4")
                .when("4", "5")
                .end("1");
        apiPlatDataExchange.setSesameCredit(sesameCredit);

        /*
            我方字典-白条额度
            1.无额度
            2.3千以下
            3.3千-1万
            4.1万-3万
            5.3万以上
            如果对方文档需要"文字类型"如:无额度,3千以下,使用使用apiFieldConverter.getBtLimitText
         */
        String btLimit = ChooseEq.create(apiDataChangeMessage.getBtLimit())
                .when("1", "1")
                .when("2", "3")
                .when("3", "3")
                .when("4", "2")
                .when("5", "2")
                .end("1");
        apiPlatDataExchange.setBtLimit(btLimit);

        /*
            我方字典-花呗额度
            1.无额度
            2.3千以下
            3.3千-1万
            4.1万-3万
            5.3万以上
            如果对方文档需要"文字类型"如:无额度,3千以下,使用使用apiFieldConverter.getHbLimitText
         */
        String hbLimit = ChooseEq.create(apiDataChangeMessage.getHbLimit())
                .when("1", "1")
                .when("2", "3")
                .when("3", "3")
                .when("4", "2")
                .when("5", "2")
                .end("1");
        apiPlatDataExchange.setHbLimit(hbLimit);

        /*
           我方字典-信用情况（逾期）
           1.无逾期
           2.当前有逾期
           3.一年以内无逾期
           如果对方文档是需要返回"0"和"1" 使用:apiFieldConverter.hasOverdueToNumber
           如果对方文档是需要返回"有"和"无",使用:apiFieldConverter.hasOverdueToStr方法
         */
        String overdue = ChooseEq.create(apiDataChangeMessage.getOverdue())
                .when("1", "1")
                .when("2", "2")
                .when("3", "4")
                .end("1");
        apiPlatDataExchange.setOverdue(overdue);

        /*
          我方字典-信用卡额度
          1.无信用卡
          2.3千以下
          3.3千-1万
          4.1-3万
          5.3万以上
          6.有信用卡
          如果对方只需要"有/无"使用:apiFieldConverter.hasCreditLimitToStr
          如果对方只需要"0/1"使用:apiFieldConverter.hasCreditLimitToNumber
        */
        String creditLimit = ChooseEq.create(apiDataChangeMessage.getCreditLimit())
                .when("1", "1")
                .when("2", "2")
                .when("3", "2")
                .when("4", "2")
                .when("5", "2")
                .when("6", "2")
                .end("1");
        apiPlatDataExchange.setCreditLimit(creditLimit);

        /*
           我方字典-贷款金额
           1.3万以下
           2.5万-10万
           3.10万-20万
           4.20万以上
           如果对方文档需要"带单位"如:3万，5万,使用apiFieldConverter.getLoanAmountUnit
           如果对方文档需要"数字形式"使用apiFieldConverter.getLoanAmountInt(),返回30000，50000
         */
        String loanAmount = ChooseEq.create(apiDataChangeMessage.getLoanAmount())
                .when("1", "1")
                .when("2", "3")
                .when("3", "4")
                .when("4", "5")
                .end("1");
        apiPlatDataExchange.setLoanAmount(loanAmount);

        /*
          我方字典-月收入
          1.1000-3000
          2.3000-8000
          3.8000~15000
          4.15000~30000
          5.30000以上
          如果对方需要"数值形式"如:3000,5000,使用apiFieldConverter.getMonthlySalaryNumber
          如果对方需要"有无月收入"如:有/无，使用使用apiFieldConverter.hasMonthlySalaryToStr
          如果对方需要"有无月收入"如:0/1，使用使用apiFieldConverter.hasMonthlySalaryToNumber
        */
        String monthlySalary = ChooseEq.create(apiDataChangeMessage.getMonthlySalary())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "4")
                .when("5", "4")
                .end("1");
        apiPlatDataExchange.setMonthlySalary(monthlySalary);

       /*
          营业执照注册年限
          1.未注册
          2.注册1年以下
          3.注册1~5年
          4.注册5年以上
       */
        String bizLicenseYear = ChooseEq.create(apiDataChangeMessage.getBizLicenseYear())
                .when("1", "2")
                .when("2", "1")
                .when("3", "1")
                .when("4", "1")
                .end("2");
        apiPlatDataExchange.setBizLicenseYear(bizLicenseYear);
        String string = apiDataChangeMessage.getApplyId();
        String applyId = TEMP.get(string).toString();
        JSONObject jsonObject = JsonUtils.get(applyId);
        String reqId = jsonObject.getString("reqId");
        String orderId = jsonObject.getString("orderId");
        apiPlatDataExchange.setRequestId(reqId);
        apiPlatDataExchange.setProductNo(orderId);

        Map<String, String> hashMap = new HashMap<>();
        hashMap.put("name", "《个人信息授权书》");
        hashMap.put("url", H5DomainUrlUtils.createUserProtocolUrl(apiDataChangeMessage.getProductPlanId(), apiDataChangeMessage.getPhoneMd5()));
        List<Map<String, String>> arrayList = new ArrayList<>();
        arrayList.add(hashMap);

        apiPlatDataExchange.setAgreement(arrayList);

        apiPlatDataExchange.setClientIp(apiDataChangeMessage.getIp());
        if (StringUtils.isEmpty(apiDataChangeMessage.getIp())) {
            apiPlatDataExchange.setClientIp("127.0.0.1");
        }
    }

    /**
     * 撞库字段转换映射
     * 1.撞库字段转换(不需要的自行删除)
     * 2.第一个形参值是我方值, 第二个形参值,是对方文档值,必须注意参数类型对应, end指的是如果都不存在给默认值)
     */
    private void dataExchangeFieldMapping(ApiDataExchangeParameter apiDataChangeMessage, ApiPlatDataExchangeKaiXinHua apiPlatDataExchange) {
        apiPlatDataExchange.setUserName("浩安星");
        apiPlatDataExchange.setAge(apiDataChangeMessage.getAge());
        apiPlatDataExchange.setPhoneMask(apiDataChangeMessage.getPhoneMask());
        apiPlatDataExchange.setCity(apiDataChangeMessage.getCity());
        apiPlatDataExchange.setWeilidai("1");
        apiPlatDataExchange.setProvince(apiDataChangeMessage.getProvinceName());
        String loanTerm = ChooseEq.create(apiDataChangeMessage.getLoanTerm())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "4")
                .when("5", "4")
                .when("6", "4")
                .end("1");
        apiPlatDataExchange.setLoan_time(loanTerm);
        //  性别-要获取中文性别（男/女）使用apiFieldConverter.getSexText
        String sex = ChooseEq.create(apiDataChangeMessage.getSex())
                .when("0", "1")
                .when("1", "2")
                .end("1");
        apiPlatDataExchange.setSex(sex);

        /*
           我方字典-职业
           1.上班族
           2.自由职业
           3.企业主（有营业执照）
           4.公务员或事业单位
           如果对方需要"文字形式"如:上班族/公务员或事业单位,使用apiFieldConverter.getCareerText
           如果对方需要"有无职业或者是否有工作"如:有/无，使用使用apiFieldConverter.hasCareerToStr
           如果对方需要"有无职业或者是否有工作"如:0/1，使用使用apiFieldConverter.hasCareerToNumber
         */
        String career = ChooseEq.create(apiDataChangeMessage.getCareer())
                .when("1", "1")
                .when("2", "4")
                .when("3", "2")
                .when("4", "5")
                .when("5", "3")
                .end("1");
        apiPlatDataExchange.setCareer(career);

        /*
          我方字典-学历
          1.初中及以下
          2.中专
          3.高中
          4.大专
          5.本科
          6.研究生及以上
        */
        String educationAttainment = ChooseEq.create(apiDataChangeMessage.getEducationAttainment())
                .when("1", "2")
                .when("2", "4")
                .when("3", "3")
                .when("4", "5")
                .when("5", "6")
                .when("6", "7")
                .end("1");
        apiPlatDataExchange.setEducationAttainment(educationAttainment);

        /*
          我方字典-社保缴纳
          1.无社保
          2.缴纳6个月以下
          3.缴纳6个月以上
          4.有社保
          如果对方需要"有无社保情况"如:有/无，使用使用apiFieldConverter.hasSocialSecurityToStr
          如果对方需要"有无社保情况"如:0/1，使用使用apiFieldConverter.hasSocialSecurityToNumber
        */
        String socialSecurity = ChooseEq.create(apiDataChangeMessage.getSocialSecurity())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "2")
                .end("1");
        apiPlatDataExchange.setSocialSecurity(socialSecurity);

        /*
          我方字典-公积金
          1.无公积金
          2.缴纳6个月以下
          3.缴纳6个月以上
          4.有公积金
          如果对方只需要"有/无"使用:apiFieldConverter.hasProvidentFundToStr
          如果对方只需要"0/1"使用:apiFieldConverter.hasProvidentFundToNumber
        */
        String providentFund = ChooseEq.create(apiDataChangeMessage.getProvidentFund())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "2")
                .end("1");
        apiPlatDataExchange.setProvidentFund(providentFund);

        /*
          我方字典-房产情况
          1.无房产
          2.有房不抵押
          3.有房可抵押
          4.有房产
          5.有按揭房产
          6.有全款房产
          如果对方需要"有无月收入"如:有/无，使用使用apiFieldConverter.hasRealEstateInfoToStr
          如果对方需要"有无月收入"如:0/1，使用使用apiFieldConverter.hasRealEstateInfoToNumber
        */
        String realEstateInfo = ChooseEq.create(apiDataChangeMessage.getRealEstateInfo())
                .when("1", "1")
                .when("2", "3")
                .when("3", "4")
                .when("4", "3")
                .when("5", "2")
                .when("6", "3")
                .end("1");
        apiPlatDataExchange.setRealEstateInfo(realEstateInfo);

        /*
           我方字典-车辆情况
           1.无车产
           2.有车不抵押
           3.有车可抵押
           4.有车
           如果对方文档是需要返回"0"和"1" 使用:apiFieldConverter.hasCarInfoToNumber
           如果对方文档是需要返回"有"和"无",使用:apiFieldConverter.hasCarInfoToStr
         */
        String carInfo = ChooseEq.create(apiDataChangeMessage.getCarInfo())
                .when("1", "1")
                .when("2", "3")
                .when("3", "4")
                .when("4", "4")
                .end("1");
        apiPlatDataExchange.setCarInfo(carInfo);

       /*
            我方字典-保险保单
            1.无保险保单
            2.缴纳未满1年
            3.缴纳1年以上
            4.有保险保单
            如果对方只需要"有/无"使用:apiFieldConverter.hasInsurancePolicyToStr
            如果对方只需要"0/1"使用:apiFieldConverter.hasInsurancePolicyToNumber
        */
        String insurancePolicy = ChooseEq.create(apiDataChangeMessage.getInsurancePolicy())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "2")
                .end("1");
        apiPlatDataExchange.setInsurancePolicy(insurancePolicy);

        /*
           我方字典-芝麻分
           1.600分以下
           2.600~649分
           3.650~699分
           4.700分以上
           如果对方需要"分值形式"如:650，700,使用apiFieldConverter.getSesameCreditNumber/getSesameCreditStr
           如果对方要"文字形式"如:600分以下,600~649分,使用apiFieldConverter.getSesameCreditText
         */
        String sesameCredit = ChooseEq.create(apiDataChangeMessage.getSesameCredit())
                .when("1", "2")
                .when("2", "3")
                .when("3", "4")
                .when("4", "5")
                .end("1");
        apiPlatDataExchange.setSesameCredit(sesameCredit);

        /*
            我方字典-白条额度
            1.无额度
            2.3千以下
            3.3千-1万
            4.1万-3万
            5.3万以上
            如果对方文档需要"文字类型"如:无额度,3千以下,使用使用apiFieldConverter.getBtLimitText
         */
        String btLimit = ChooseEq.create(apiDataChangeMessage.getBtLimit())
                .when("1", "1")
                .when("2", "3")
                .when("3", "3")
                .when("4", "2")
                .when("5", "2")
                .end("1");
        apiPlatDataExchange.setBtLimit(btLimit);

        /*
            我方字典-花呗额度
            1.无额度
            2.3千以下
            3.3千-1万
            4.1万-3万
            5.3万以上
            如果对方文档需要"文字类型"如:无额度,3千以下,使用使用apiFieldConverter.getHbLimitText
         */
        String hbLimit = ChooseEq.create(apiDataChangeMessage.getHbLimit())
                .when("1", "1")
                .when("2", "3")
                .when("3", "3")
                .when("4", "2")
                .when("5", "2")
                .end("1");
        apiPlatDataExchange.setHbLimit(hbLimit);

        /*
           我方字典-信用情况（逾期）
           1.无逾期
           2.当前有逾期
           3.一年以内无逾期
           如果对方文档是需要返回"0"和"1" 使用:apiFieldConverter.hasOverdueToNumber
           如果对方文档是需要返回"有"和"无",使用:apiFieldConverter.hasOverdueToStr方法
         */
        String overdue = ChooseEq.create(apiDataChangeMessage.getOverdue())
                .when("1", "1")
                .when("2", "2")
                .when("3", "4")
                .end("1");
        apiPlatDataExchange.setOverdue(overdue);

        /*
          我方字典-信用卡额度
          1.无信用卡
          2.3千以下
          3.3千-1万
          4.1-3万
          5.3万以上
          6.有信用卡
          如果对方只需要"有/无"使用:apiFieldConverter.hasCreditLimitToStr
          如果对方只需要"0/1"使用:apiFieldConverter.hasCreditLimitToNumber
        */
        String creditLimit = ChooseEq.create(apiDataChangeMessage.getCreditLimit())
                .when("1", "1")
                .when("2", "2")
                .when("3", "2")
                .when("4", "2")
                .when("5", "2")
                .when("6", "2")
                .end("1");
        apiPlatDataExchange.setCreditLimit(creditLimit);

        /*
           我方字典-贷款金额
           1.3万以下
           2.5万-10万
           3.10万-20万
           4.20万以上
           如果对方文档需要"带单位"如:3万，5万,使用apiFieldConverter.getLoanAmountUnit
           如果对方文档需要"数字形式"使用apiFieldConverter.getLoanAmountInt(),返回30000，50000
         */
        String loanAmount = ChooseEq.create(apiDataChangeMessage.getLoanAmount())
                .when("1", "1")
                .when("2", "3")
                .when("3", "4")
                .when("4", "5")
                .end("1");
        apiPlatDataExchange.setLoanAmount(loanAmount);

        /*
          我方字典-月收入
          1.1000-3000
          2.3000-8000
          3.8000~15000
          4.15000~30000
          5.30000以上
          如果对方需要"数值形式"如:3000,5000,使用apiFieldConverter.getMonthlySalaryNumber
          如果对方需要"有无月收入"如:有/无，使用使用apiFieldConverter.hasMonthlySalaryToStr
          如果对方需要"有无月收入"如:0/1，使用使用apiFieldConverter.hasMonthlySalaryToNumber
        */
        String monthlySalary = ChooseEq.create(apiDataChangeMessage.getMonthlySalary())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "4")
                .when("5", "4")
                .end("1");
        apiPlatDataExchange.setMonthlySalary(monthlySalary);

       /*
          营业执照注册年限
          1.未注册
          2.注册1年以下
          3.注册1~5年
          4.注册5年以上
       */
        String bizLicenseYear = ChooseEq.create(apiDataChangeMessage.getBizLicenseYear())
                .when("1", "2")
                .when("2", "1")
                .when("3", "1")
                .when("4", "1")
                .end("2");
        apiPlatDataExchange.setBizLicenseYear(bizLicenseYear);

        apiPlatDataExchange.setRequestId(apiDataChangeMessage.getReqId());

        apiPlatDataExchange.setClientIp(apiDataChangeMessage.getIp());
        if (StringUtils.isEmpty(apiDataChangeMessage.getIp())) {
            apiPlatDataExchange.setClientIp("127.0.0.1");
        }
    }
}
